package org.waddy.framework.pub.util;

/**
 * 文件名：ReflectUtil.java
 *
 * 版本信息：v1.0
 * 日期：2011-3-3
 */

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.apache.log4j.Logger;


/**
 * 项目名称：BaseUtils
 * 类名称：ReflectUtil
 * 类描述：反射工具类
 * @author 张大朋
 * @since 2011-3-3 下午03:20:28
 * @version 1.0
 */
public class ReflectUtil {
	
	private static final Logger logger =Logger.getLogger(ReflectUtil.class);
	
	/**
	 * 根据属性名获取属性值
	 * @param bean 目标对象bean
	 * @param fieldName 目标bean的属性名称，要求大小写严格相同
	 */
	public static Object getProperty(Object bean, String fieldName) {  

		Class clazz =bean.getClass();
	    Field[] fields = clazz.getDeclaredFields();  
		Method[] ms =clazz.getMethods();
	    Field.setAccessible(fields, true);     
	    Object obj = null;  
	    for (int i = 0; i < fields.length; i++) {  
	        Field field = fields[i];  
	        if (fieldName.equals(field.getName())) {  
	            try {  
	            	field.setAccessible(true);
	            	obj = field.get(bean);  
	            } catch (IllegalArgumentException e) {  
	                logger.error(e.getMessage());  
	            } catch (IllegalAccessException e) {  
	                logger.error(e.getMessage());  
	            }  
	        }  
	    }  
	    return obj;   
	}
	
	/**
	 * 为指定对象的指定属性 赋指定值
	 * @param bean 目标对象bean
	 * @param fieldName 目标bean的属性名称，要求大小写严格相同
	 * @param fieldValue 欲赋的值
	 */
	public static void setProperty(Object obj, String fieldName, Object fieldValue){
		try {
			Class clazz =obj.getClass();
			Field field =clazz.getDeclaredField(fieldName);
			field.setAccessible(true);
			field.set(obj, fieldValue);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

	/**
	 * 根据方法名 调用指定的方法
	 * @param bean 目标对象bean
	 * @param methodName 目标bean的方法名称，要求大小写严格相同
	 * @param args 目标方法的参数列表
	 */
	public static Object invoke(Object bean, String methodName, Object... args) {  

		Class clazz =bean.getClass();
		Method[] methods =clazz.getMethods();
	    Object obj = null;  
	    for (int i = 0; i < methods.length; i++) {  
	    	Method method = methods[i];  
	        if (methodName.equals(method.getName())) {  
	            try {  
	            	method.setAccessible(true);
					obj = method.invoke(bean,args);
				} catch (InvocationTargetException e) {
					logger.error("",e); 
	            } catch (IllegalAccessException e) {  
	                logger.error("",e);  
	            }  
	        }  
	    }  
	    return obj;   
	}
	
	/**
	 * 本类的测试方法
	 */
	public static void main(String[] args) {

	}

}
